package os;

import java.util.ArrayList;
import memory.Memory;

/**
 *
 * @author Paulius Dambrauskas
 */
public class JobGovernor extends Process {
    Object[] task;
    String intType;
    int ptr;
    @Override
    public void runProcess() {
        this.changeStepCell(step);
        switch(step){
           
            case 1: {
                //changeStepCell(1);
                OS.askRes("Vartotojo atm.", selfId);
                incStep(1);
                break;
            }
            case 2:{
                //changeStepCell(3);
                //PAKROVIMO PAKETAS: dvimatis masyvas
                task  =(Object[]) this.takeFromGivenResources("Užduoties duomenys").value;
                String[] pars = (String[]) task[0];
                String program = (String) task[1];
                ArrayList<ArrayList<String>> pkg = new ArrayList<>();
                for(int i = 0; i < 16; i++){
                    ArrayList<String> strA = new ArrayList<>();
                    pkg.add(strA);
                }
                if(pars != null){
                    int bound = pars.length < 16 ? pars.length : 16;
                    for(int i = 0; i < bound; i++){
                        pkg.get(0).add(pars[i]);
                    }
                }
                String[] commands = program.split("\r\n|\r|\n");
                
                int k = 0;
                for(int i = 1; i < 16; i++){
                    for(int j = 0; j < 16; j++){
                        if(commands.length > k)
                            pkg.get(i).add(commands[k]);
                        k++;
                    }
                    
                }
                OS.freeRes(new ResourceElement("Pakrovimo paketas", pkg));
                incStep(1);
                break;
            } 
            case 3:{
                //changeStepCell(3);
                OS.askRes("Loader darbo pabaiga", selfId);
                incStep(1);
                break;
            }
            case 4:{
                //changeStepCell(4);
                int nr = (int) this.takeFromGivenResources("Loader darbo pabaiga").value; //gal nieko nenutiks
                OS.freeRes(OS.processes.get(2).takeFromGivenResources("Supervizorinė atmintis"));
                //System.out.println("Cia");
                OS.createProc(selfId, 2, 40, VirtualMachine.class);
                OS.processes.get(this.children.get(0)).extra = nr+"";
                incStep(1);
                break;
            }
            case 5:{
                //changeStepCell(5);
                //System.out.println("laukiu");
                OS.askRes("Pertraukimo pranešimo", selfId);
                incStep(1);
                break;
            }
            case 6:{
                //changeStepCell(6);
                int vmId = this.children.get(0); // vis tiek tik vieną vaiką turės.
                ptr = Integer.parseInt(OS.processes.get(vmId).regs.get("PTR"));
                OS.stopProc(vmId);
                incStep(1);
                break;                
            }
            case 7:{
                //changeStepCell(7);
                intType = (String) this.takeFromGivenResources("Pertraukimo pranešimo").value;
                boolean sp = false;
                if(!intType.equals("OTHER"))
                    sp = true;
                if(sp)
                    incStep(1);
                else
                    setStep(18);
                break;
            }
            case 8:{
                //changeStepCell(8);
                if(intType.equals("START"))
                    incStep(3);
                if(intType.equals("PRINT"))
                    incStep(1);
                if(intType.equals("READ"))
                    incStep(2);
                if(intType.equals("HALT"))
                    incStep(4);
                if(intType.equals("LIGHT"))
                    setStep(19);
                break;
            }
            case 9:{
                //changeStepCell(9);
                String output = OS.processes.get(this.children.get(0)).regs.get("R");
                OS.freeRes(new ResourceElement("Eilutė", output));
                setStep(18);
                break;
            }
            case 10:{
                //changeStepCell(10);
                OS.freeRes(new ResourceElement("ILaukimas", true));
                incStep(3);
                break;
            }
            case 11:{
                //changeStepCell(11);
                OS.freeRes(new ResourceElement("Paleidimas iš VM", OS.processes.get(this.children.get(0)).regs.get("R")));
                setStep(18);
                break;
            }
            case 12:{
                //changeStepCell(12);
                int vmId = this.children.get(0);
                OS.destroyProc(vmId);
                incStep(3);
                break;
            }
            case 13:{
                //changeStepCell(13);
                OS.askRes("Vartotojo įvestis", selfId);
                incStep(1);
                break;
            }
            case 14:{
                //changeStepCell(14);
                int vmId = this.children.get(0);
                OS.processes.get(vmId).regs.put("R", (String)this.takeFromGivenResources("Vartotojo įvestis").value);
                incStep(18);
                break;
            }
            case 15:{
                //changeStepCell(15);
                OS.freeRes(this.takeFromGivenResources("Vartotojo atm."));
                Memory.cleanMem(ptr);
                incStep(1);
                break;
            }
            case 16:{
                //changeStepCell(16);
                OS.freeRes(new ResourceElement("Užduoties duomenys", "DESTROY:"+selfId));
                incStep(1);
                break;
            }
            case 17:{
                //changeStepCell(17);
                this.setState(1);
                try{
                    OS.readyList.remove(OS.readyList.indexOf(selfId));
                }catch(Exception e){}
                OS.distributor();
                break;
            }
            case 18:{
                //changeStepCell(18);
                int vmId = this.children.get(0);
                OS.activateProc(vmId);
                setStep(5);
                System.out.println("Aktivuoju");
                break;
            }
            case 19:{
                //changeStepCell(19);
                OS.freeRes(new ResourceElement("Lempa", OS.processes.get(this.children.get(0)).regs.get("C")));
                setStep(18);
                break;
            }
        }
    }
    
}
